//
// Created by Administrator on 2025/8/16.
//

#include "mqttAPI.h"
#include "lwip/sockets.h"


// #define AVAILABLE_SOCKET g_mqtt_newland_socket
// extern int g_mqtt_newland_socket;
//
//
// /**
//  * @brief 为 Paho 库封装的底层读取函数，这个函数签名是 MQTTPacket_read 所需的简化版
//  */
// int transport_read(unsigned char* buf, int len)
// {
//     // 检查 socket 句柄是否有效
//     if (AVAILABLE_SOCKET < 0) {
//         return -1;
//     }
//     // LwIP 的 recv 函数的超时由setsockopt(SO_RCVTIMEO) 控制
//     return recv(AVAILABLE_SOCKET, buf, len, 0);
// }
//
// /**
//  * @brief 为 Paho 库封装的底层写入函数
//  */
// int transport_write(unsigned char* buf, int len)
// {
//     if (AVAILABLE_SOCKET < 0) {
//         return -1;
//     }
//     return send(AVAILABLE_SOCKET, buf, len, 0);
// }

/**
 * @brief 从 MQTT 报文缓冲区中解析出报文的总长度
 * @param buf 包含完整 MQTT 报文的缓冲区
 * @return 报文的总字节数
 */
int get_mqtt_packet_length(const unsigned char* buf)
{
    uint8_t index=1;
    int32_t multiplier=1;
    uint8_t len_bytes=0;
    int now_byte=-1;
    uint16_t length=0;
    do
    {
        now_byte=buf[index++];
        length+=((now_byte)&0x7f)*multiplier;
        multiplier*=128;
        len_bytes++;
    } while (now_byte&0x80);

    return 1+len_bytes+length;
}